package com.xyz.IteratorTest;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        ReverseList<String> rlist = new ReverseList<>();
        rlist.add("Apple");
        rlist.add("Orange");
        rlist.add("Pear");
        //通过自定义的枚举器，实现反向遍历的效果
        for (String s : rlist) {
            System.out.println(s);
        }
    }
}

//自定义一个反向列表容器类，实现了 Iterable 接口
class ReverseList<T> implements Iterable<T> {

    //本身还是一个数组列表
    private List<T> list = new ArrayList<>();


    public void add(T t) {
        list.add(t);
    }

    //Iterable 接口,要实现 iterator 方法
    // iterator 方法，必须返回一个实现了 Iterator 接口的迭代器类对象
    @Override
    public Iterator<T> iterator() {
        return new ReverseIterator(list.size());
    }

    // 定义了一个内部类 ReverseIterator,实现了 Iterator 接口
    // 要实现接口中的 hasNext 和 next 方法
    // 要实现遍历，实际上是要获取指向容器内部元素的指针，并通过
    // next 方法，将指针可以移向容器中的下一项
    // 最终，通过 hasNext 方法，返回 bool 值，来判断是否已经遍历完成
    class ReverseIterator implements Iterator<T> {
        //定义索引字段，用来获取元素位置
        int index;

        //构造方法，通过索引位来创建枚举器
        ReverseIterator(int index) {
            this.index = index;
        }

        //实现的接口方法，用来判断是否已经遍历完
        //如果遍历完成，就不会再有下一项，返回 false
        //设置 index <0，就会让遍历完成
        @Override
        public boolean hasNext() {
            return index > 0;
        }

        //将索引为向后移动1
        //这个方向正好是从后往前倒序
        @Override
        public T next() {
            index--;
            return ReverseList.this.list.get(index);
        }
    }
}
